/*
 * Receiver.h
 *
 *  Created on: 2010-01-22
 *      Author: Maciej Skrzypkowski
 */

#ifndef RECEIVER_H_
#define RECEIVER_H_

#include "thread.h"
#include "tcpconnection.h"
#include "messages.h"
#include "lock.h"
#include <list>

class SemLib;


/*
 * Klasa towrząca wątek odbierający wiadomości od danego
 * serwera. Po odebraniu pinga odpowiedź jest natychmiastowa,
 * inne wiadomości trafiają do kolejki odebranych komunikatów.
 */
class Receiver : public Thread {
public:
	Receiver(TCPConnection * conn, SemLib* semLib, String serverName);
	virtual ~Receiver();

	/*
	 * Główna pętla wątku, odbierająca wiadomości.
	 */
	void _run(void);

	/*
	 * Zwraca ostatnią odebraną wiadomość, która
	 * znalazła się w kolejce.
	 */
	AnyMessage* getNewMsg();

	/*
	 * Kończy działanie wątku odbierającego.
	 */
	void end();
private:
	/*
	 * Semafor blokujący przy odczytywaniu nowych wiadomości z kolejki,
	 * po wpisaniu nowej wiadomości semafor jest podnoszony.
	 */
	Lock* lock;
	/*
	 * Mutex sychronizujący dostęp do kolejki.
	 */
	Lock* listMutex;
	/*
	 * Połączenie z serwerem.
	 */
	TCPConnection * conn;
	/*
	 * Czy wątek ma działać.
	 */
	bool running;

	SemLib* semLib;

	/*
	 * Kolejka odebranych wiadomości.
	 */
	std::list<AnyMessage*> msgList;
	String serverName;
};

#endif /* RECEIVER_H_ */
